Query
核心的理念是这也就是”GraphQL”,并没有什么新内容.
基础查询
简单的使用graphql
container. 解析查询使用的gql
模板字符串,并传递给graphql
container.作为第一个参数.
实例 : 在‘GitHunt’中,我们会在Profile
组件显示当前登录的用户
1 | import React, { Component } from 'react'; |
在我们使用graphql
时, 会发生两件事:
- 查询从 Apollo-client的 data store 加载,如果不在 data store 中就从 server 加载
- 我们的组件订阅到 store. 所以如果数据发生改变, 组件就会更新
此外,对于在 query中的currentUser
字段,data
属性也包含有字段loading
,这是一个布尔值, 表示当前从 server 加载数据的状态. 还有一个字段error
,表示是否在加载数据时出现错误. 所以具体的属性的外观如下:
1 | (props) => { |
data.currentUser
属性会随着用户的变化而发生变化. 信息存储在 Apollo client 的 全局 cache 中.
data
属性的结构
如上所示, graphql
会传递查询结果到被包装的组件,形式是data
属性. 实际也传递所有的父组件的 props.
对于查询, data
属性的外观如下
...fileds
: 查询中的每个根字段loading
: 如果有查询进行中, 这个字段为true
,包含refetch
查询时也是如此error
: APolloError对象代表查询中可能出现的各种错误.例如下面的查询:
1 | query getUserAndLikes($id: ID!) { |
我们得到的 props 如下:
1 | data: { |
Variables 和 options
如果想定制query,可以提供 option选项,作为graphql
的第二个参数(第一个参数为查询字符串).如果需要传递变量,要在这个地方传递
1 | // Suppose our profile query took an avatar size |
默认情况下, graphql
会尝试从ownPorps
中获取需要的变量
其他的 options
可以传递其他的 options,例如pollInterval
1 | const ProfileWithData = graphql(CurrentUserForLayout, { |
skipping an operation
//如果认证没有通过就跳过这个查询,可以直接设为静态的 skip:true
1 | const ProfileWithData = graphql(CurrentUserForLayout, { |
改变 prop的名字
1 | import React, { Component } from 'react'; |
任意的转换
想完全控制传递给子组件的 props,可以使用props
option 把 query 的data
映射为任意数量的 props
1 | import React, { Component } from 'react'; |
这个方式最大限度的解耦了展示组件(Profile)和 Apollo
API Reference
1 | render() { |
如果我们要下面的查询
1 | { |
你的data
props 将会包含如下数据
1 | render() { |
data.networkStatud
loading
setVariables
: query 的变量改变fetchMore
: 表示fetchMore
在调用refetch
: refetch 在调用poll
: polling 在调用ready
: 没有操作进行中error
: 没有请求, 但是至少有一个错误
如果 network status 小于7 等同于data.loading
==true
实例
1 | function MyComponent({ data: { networkStatus } }) { |
data.variables
Apollo 用于获取数据的参数, 如果你想渲染一些与参数有关的信息
1 | function MyComponent({ data: { variables } }) { |
data.refetch(variables)
强制你的组件重新执行在graphql()
函数中定义的操作. 当你想重载数据,或者是遇到错误时再次获取数据
data.refetch
返回一个promise,resolves返回新的数据.
data.fetchMore(options)
data.fetchMore
函数可以实现组件的分页操作. 接收单个options
对象作为参数,有下面的属性:
[query]
:可选项,如果不使用就从graphql()
hoc采用[variables]
: 可选的参数, 和上面一样的用法updateQuery(previousResult,{fetchMoreResult,queryVariables})
:实际执行分页时的函数. 第一个参数previousResult
,是之前的查询返回的数据, 第二个参数有两个属性,fetchMoreResult
,queryVariables
,fetchMoreResult
是新查询返回的数据,queryVariables
是获取更多数据时采用的参数.使用这些参数,你应该返回一个新的data
,和之前的data的外观一致. 参看下面的的实例
1 | data.fetchMore({ |
data.subscribeToMore(options)
这个函数会配置 subscrption,当 server 发布subscription时,触发更新.需要在 server 做相应的工作.
还会返回一个unscribe()
函数,可以用于解绑定
通常的实践是在componentWillReceiveProps
内包装subscribeToMore
调用,在原始的查询完成之后,执行订阅. 为了确保不会多次创建 subscription.可以添加到组件实例上.
[document]
: graphql 的查询字符串[variables]
: 可选的参数, 可以用在document
option 中[updataQuery]
: 可选的函数, server 发送更新时时会执行. 第一个参数previousResult
是之前的查询结果,第二个参数是一个对象,有两个属性,subscriptionData
是订阅的结果.variables
是用于订阅的参数[onError]
: 可选的出现错误的回调函数
1 | class SubscriptionComponent extends Component { |
data.startPolling(interval)
这个函数设置一个间隔, 间隔时间完了以后会发送一个 fetch请求. 直接收一个整数参数. Polling 是保持 UI中数据随时更新的好方法. 通过设置每5秒中重新获取数据. 可以有效的模拟实现实时数据更新, 后台不需要做任何的构建工作
1 | class MyComponent extends Component { |
data.stopPolling()
通过调用这个函数,可以停止当前的 polling 过程.
1 | class MyComponent extends Component { |
data.updateQuery((previousResult) => ({
…previousResult,
count: previousResult.count + 1,
}));1
2
3
4
5
6
7
8
9
10
11
12
13
### `config.options`
用于配置查询和更新的对象或者函数
如果`config.options`是一个函数,就可以接受一个组件的 props 作为第一个参数.
```js
export default graphql(gql`{ ... }`, {
options: {
// Options go here.
},
})(MyComponent);
1 | export default graphql(gql`{ ... }`, { |
options.variables
用于执行查询的变量. 这些变量应该和查询中定义的变量一一对应. 如果config.options
作为函数,就可以从props 中计算变量
实例:
1 | export default graphql(gql` |
optins.fetchPolicy
fetchPolicy 是可选项,可以定制组件和 Apollo data cache 交互的方法. 默认情况下, 组件首先尝试从 cache获取数据. 如果需要的所有数据都在 cache 中, Apoll 会直接从 cache 中返回数据.
有效的fetchPolicy
如下:
cache-first
: 默认的选项cache-and-network
: 如果 cache 中有全部数据, 就会直接返回,但是网络获取也会执行, 从而保持了 server 和 cache 的数据一致性. 不仅使用户迅速获得数据,还保持数据的一致性network-only
: 不从 cache 中返回数据cache-only
: 不执行网络获取
1 | export default graphql(gql`query { ... }`, { |
options.errorPolicy
用于定制 fetch data error的处理. runtime error和获取数据错误
none
: 默认值,ignore
:all
:
options.pollInterval
1 | export default graphql(gql`query { ... }`, { |
options.notifyOnNetworkStatusChange
网络状态发生变化时,触发组件的重新渲染
实例:
1 | export default graphql(gql`query { ... }`, { |
optins.context
在context
对象下的所有的内容都可以直接传递到 network chain 中.